/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package examen3;


import java.util.ArrayList;
import java.util.List;
import org.jgap.Chromosome;
import org.jgap.Configuration;
import org.jgap.DefaultFitnessEvaluator;
import org.jgap.Gene;
import org.jgap.Genotype;
import org.jgap.IChromosome;
import org.jgap.InvalidConfigurationException;
import org.jgap.impl.DefaultConfiguration;
import org.jgap.impl.IntegerGene;
import org.jgap.impl.SwappingMutationOperator;

/**
 *
 * @author johnsolano
 */
public class TestFitnessEquipo {
    
    private Configuration conf ;
    private SwappingMutationOperator swapper;
    private EquipoFitnessFunction fitnessFunction = null;
    public List equipos = new ArrayList();
    public List rankings = new ArrayList();
    Equipo carEquipos ;

    private static final int MAX_ALLOWED_EVOLUTIONS = 1000;
    private Chromosome equipoChromosome = null;
    
    public void initialize() throws Exception {
    
        equipos=carEquipos.listaEquipos();

        conf = new DefaultConfiguration();
        Configuration.resetProperty(Configuration.PROPERTY_FITEVAL_INST);
        conf.setFitnessEvaluator(new DefaultFitnessEvaluator());
        conf.getGeneticOperators().clear();

        swapper = new SwappingMutationOperator(conf);
        conf.addGeneticOperator(swapper);
        conf.setPreservFittestIndividual(true);
        conf.setPopulationSize(1000);
        conf.setKeepPopulationSizeConstant(false);

        fitnessFunction = new EquipoFitnessFunction(equipos, rankings);

        conf.setFitnessFunction(fitnessFunction);

        Gene[] equipoGenes = new Gene[4];

        equipoGenes[0] = new IntegerGene(conf, 0, equipos.size() - 1);
        equipoGenes[1] = new IntegerGene(conf, 0, equipos.size() - 1);
        equipoGenes[2] = new IntegerGene(conf, 0, equipos.size() - 1);
        equipoGenes[3] = new IntegerGene(conf, 0, equipos.size() - 1);
        equipoChromosome = new Chromosome(conf, equipoGenes);
        
        equipoGenes[0].setAllele(new Integer(0));
        equipoGenes[1].setAllele(new Integer(1));
        equipoGenes[2].setAllele(new Integer(2));
        equipoGenes[3].setAllele(new Integer(3));

        conf.setSampleChromosome(equipoChromosome);
        
    }


    public void testSelectFittestEquipo() throws Exception {

      
       // equipos=carEquipos.listaEquipos();
        Genotype population = Genotype.randomInitialGenotype(conf);

        IChromosome bestSolutionSoFar = equipoChromosome;

        for (int i = 0; i < MAX_ALLOWED_EVOLUTIONS; i++) {
            
            population.evolve();
            IChromosome candidateBestSolution = population.getFittestChromosome();
            
            if (candidateBestSolution.getFitnessValue() > bestSolutionSoFar.getFitnessValue()) {
                bestSolutionSoFar = candidateBestSolution;
                
            }
            //System.out.println(bestSolutionSoFar);
        }
        printSolution(bestSolutionSoFar, equipos);
        
      
    }
  
    public List<Equipo> eq = new ArrayList<Equipo>();
    public String fitness;
    public void printSolution(IChromosome solution, List equipos) {
       // System.out.println("#################################################################################################################");
        //System.out.println("Valor del Fitness: " + solution.getFitnessValue());
        fitness = String.valueOf(solution.getFitnessValue());
        for (int i = 0; i < solution.size(); i++) {
            int index = (Integer) solution.getGene(i).getAllele();
            Equipo equipo = (Equipo) equipos.get(index);
            //System.out.println(equipo.toString());
            eq.add(equipo);
            
        }
        //System.out.println(eq);
       // System.out.println("#################################################################################################################");
    }
    
   public List selecionaEquipo() throws Exception {

     
        ArrayList eg = new ArrayList();
        Genotype population = Genotype.randomInitialGenotype(conf);

        IChromosome bestSolutionSoFar = equipoChromosome;
        
        for (int i = 0; i < MAX_ALLOWED_EVOLUTIONS; i++) {
            
            population.evolve();
            IChromosome candidateBestSolution = population.getFittestChromosome();
                bestSolutionSoFar = candidateBestSolution;
                //System.out.println(bestSolutionSoFar.getFitnessValue());
                eg.add(equipos);
               // System.out.println(eg);
        }
        //printSolution(bestSolutionSoFar, equipos2);
        
        return eg;
    }
  
    
}
